home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / ARGONET / PD / DTP / PDFENCRY.SPK / rc4_cc < prev    next >
Text File  |  1998-04-04  |  1KB  |  71 lines

  1. /************************************************************************
  2.  *                                    *
  3.  * RC4 Encryption Algorithm                         *
  4.  * Copyright Peter Gutmann 1995-1996                    *
  5.  *                                    *
  6.  ************************************************************************/
  7.  
  8. /* Optimized RC4 code, from an unknown source ("and they knew not from whence
  9.    it had come...") */
  10.  
  11. #include "rc4.h"
  12.  
  13. void
  14. rc4ExpandKey( RC4KEY *rc4, unsigned char const *key, int keylen )
  15. {
  16.     int x, keypos = 0;
  17.     rc4word sx, y = 0;
  18.     rc4word *state = &rc4->state[ 0 ];
  19.  
  20.     rc4->x = rc4->y = 0;
  21.  
  22.     for( x = 0; x < 256; x++ )
  23.         state[ x ] = x;
  24.  
  25.     for( x = 0; x < 256; x++ )
  26.         {
  27.         sx = state[ x ];
  28.         y += sx + key[ keypos ];
  29. #ifdef USE_LONG_RC4
  30.         y &= 0xFF;
  31. #endif /* USE_LONG_RC4 */
  32.         state[ x ] = state[ y ];
  33.         state[ y ] = sx;
  34.  
  35.         if( ++keypos == keylen )
  36.             keypos = 0;
  37.         }
  38.     }
  39.  
  40. void
  41. rc4Crypt( RC4KEY *rc4, unsigned char *data, int len )
  42. {
  43.     rc4word x = rc4->x, y = rc4->y;
  44.     rc4word sx, sy;
  45.     rc4word *state = &rc4->state[ 0 ];
  46.  
  47.     while (len--) {
  48.         x++;
  49. #ifdef USE_LONG_RC4
  50.         x &= 0xFF;
  51. #endif /* USE_LONG_RC4 */
  52.         sx = state[ x ];
  53.         y += sx;
  54. #ifdef USE_LONG_RC4
  55.         y &= 0xFF;
  56. #endif /* USE_LONG_RC4 */
  57.         sy = state[ y ];
  58.         state[ y ] = sx;
  59.         state[ x ] = sy;
  60.  
  61. #ifdef USE_LONG_RC4
  62.         *data++ ^= state[ ( unsigned char ) ( sx+sy ) ];
  63. #else
  64.         *data++ ^= state[ ( sx+sy ) & 0xFF ];
  65. #endif /* USE_LONG_RC4 */
  66.     }
  67.  
  68.     rc4->x = x;
  69.     rc4->y = y;
  70. }
  71.